package global

import (
	"errors"
	"fmt"
	"strconv"

	"github.com/bwmarrin/snowflake"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"gorm.io/gorm"
	"xincan.com.cn/tarot-go-framework/config"
)

// SnowFlakeId 雪花算法ID生成(mysql主键使用)
type SnowFlakeId string

var (
	Logger    *zap.Logger             // 日志
	Sugar     *zap.SugaredLogger      // 日志
	Viper     *viper.Viper            // 远程配置
	AppConfig *config.AppConfig       // 应用配置
	Valid     *config.ValidatorObject // 验证器
	DBClient  *gorm.DB                // 数据库客户端
	Node      *snowflake.Node         // 雪花算法
)

// Scan 实现 sql.Scanner 接口
// 它用于从数据库读取值并存储到 SnowFlakeId 类型的变量中
func (s *SnowFlakeId) Scan(value interface{}) error {
	if value == nil {
		*s = SnowFlakeId(strconv.Itoa(0))
		return nil
	}
	switch v := value.(type) {
	case []byte:
		*s = SnowFlakeId(v)
		return nil
	case int64:
		*s = SnowFlakeId(strconv.Itoa(int(v)))
		return nil
	case string:
		var i int64
		if _, err := fmt.Sscanf(v, "%d", &i); err != nil {
			return err
		}
		*s = SnowFlakeId(strconv.FormatInt(i, 10))
		return nil
	default:
		Logger.Error("雪花算法转化失败", zap.Reflect("type", v))
		return errors.New("雪花算法转化失败")
	}
}
